package nettest

import (
	"bufio"
	"fmt"
	p "gitee.com/yunduansing/test/proto"
	"github.com/golang/protobuf/proto"
	"github.com/panjf2000/ants/v2"
	"io/ioutil"
	"log"
	"net"
	"strconv"
	"sync"
	"time"
)
//var pool *tunny.Pool
//func init()  {
//	//numCPUs := runtime.NumCPU()
//	pool = tunny.NewFunc(100, func(conn interface{}) interface{} {
//
//		// TODO: Something CPU heavy with payload
//		defer conn.(net.Conn).Close() // 关闭连接
//		for {
//			reader := bufio.NewReader(conn.(net.Conn))
//			var buf [128]byte
//			n, err := reader.Read(buf[:]) // 读取数据
//			if err != nil {
//				fmt.Println("read from client failed, err:", err)
//				break
//			}
//			recvStr := string(buf[:n])
//			fmt.Println("收到client端发来的数据：", recvStr)
//
//			conn.(net.Conn).Write([]byte("啊啊啊啊啊啊啊\n")) // 发送数据
//		}
//		return nil
//	})
//}
func handleConnWithPool(conn net.Conn){
	ants.Submit(func() {
		handleConn(conn)
	})
}

func Server()  {
	listen,err:=net.Listen("tcp",":8088")
	log.Println("Starting listening on 8088...")
	if err!=nil{
		panic(err)
	}
	c:=0
	for{
		conn,e:=listen.Accept()
		c++
		fmt.Println("cccccccccccc：",c)
		if e!=nil{
			log.Fatal(e)
			continue
		}
		go handleConn(conn)
	}
}
var mu sync.Mutex
var connCount int
func handleConn(conn net.Conn)  {
	defer conn.Close() // 关闭连接
	for {
		reader := bufio.NewReader(conn)
		var buf [128]byte
		n, err := reader.Read(buf[:]) // 读取数据
		if err != nil {
			fmt.Println("read from client failed, err:", err)
			break
		}


		//ants.Submit(func() {
			var recv proto.Message
			recv=&p.User{}
			proto.Unmarshal(buf[:n],recv)
			time.Sleep(time.Microsecond*50)
			fmt.Println("收到client端发来的数据：", recv)

			conn.Write([]byte("啊啊啊啊啊啊啊\n")) // 发送数据
		//})
	}
}

func Clients(i int)  {
	conn,err:=net.Dial("tcp","127.0.0.1:8088")

	if err!=nil{
		log.Fatal(err,1111)
		return
	}
	defer conn.Close()
	_,err=conn.Write([]byte(strconv.Itoa(i)))
	if err!=nil{
		log.Fatal(err)
		return
	}
	reader:=bufio.NewReader(conn)
	data,err:=ioutil.ReadAll(reader)
	if err!=nil{
		log.Fatal(err)
		return
	}
	fmt.Println(string(data))
}

func GetConn() net.Conn {
	conn,_:=net.Dial("tcp","127.0.0.1:8088")

	return conn
}

func TryLongConn(i int,conn *net.Conn) {
	var msg proto.Message=&p.User{
		Id:   1,
		Name: "張三",
	}
	content,_:=proto.Marshal(msg)
	_,err:=(*conn).Write(content)
	if err!=nil{
		log.Fatal(err)
		return
	}
	log.Println("发送成功")
	reader:=bufio.NewReader(*conn)
	data,err:=ioutil.ReadAll(reader)
	if err!=nil{
		log.Fatal(err)
		return
	}
	fmt.Println(string(data))
}
